/**
 * @author LTC
 */
 	function addJavascript(nomeJs, nomeTag) {
		var tag = document.getElementsByTagName(nomeTag)[0];
		var script = document.createElement('script');
		//script.setAttribute('type','text/javascript');
		//script.setAttribute('src',nomeJs);
		script.type	=	'text/javascript';
		script.src	=	nomeJs;
		tag.appendChild(script);
	}
 
	addJavascript('/constructore/includes/js/config.js', 'head');
	
	/**
	 * Retorna um array com todos os Niveis possiveis de curso.
	 * @return array
	 */
	function getNiveis() {
		var niveis	=	new Array();
		
		niveis['fundamental']	=	'Fundamental';
		niveis['medio']			=	'Médio';
		niveis['graduacao']		=	'Graduação';
		niveis['posgraduacao']	=	'Pós-Graduação';
		niveis['outro']			=	'Outro';
		
		return niveis;
	}
	
	/**
	 * Retorna um array com todas as Titulacoes possiveis de professor.
	 * @return array
	 */
	function getTitulacoes() {
		var	titulacoes	=	new Array();
		
		titulacoes['graduacao']			=	'Graduação';
		titulacoes['especializacao']	=	'Especialização';
		titulacoes['mestrado']			=	'Mestrado';
		titulacoes['doutorado']			=	'Doutorado';
		titulacoes['posdoutorado']		=	'Pós-Doutorado';
		
		return titulacoes;
	}

 	/**
	 * Verifica se o argumento numero e um numero e se o tamanho do mesmo e ">=", "<=", ou "=="[default] a tamanho. Se nenhum tamanho foi passado, essa verificacao nao e feita.
	 * @return bool
	 * @param {int} numero
	 * @param {int}[optional] tamanho
	 * @param {strin}[optional] comparacao Pode assumir os valores "="[default], "<=" ou ">=". 
	 */
	
	function validaNumero(numero, tamanho, comparacao){
		if (!tamanho){
			tamanho	=	false;
		}
		
		if (!comparacao){
			comparacao	=	'=';
		}
		if (tamanho){
			if (comparacao	==	'<='){
				if(!(String(numero).length <= tamanho)){
					return false;
				}
			}
			else{
				if(comparacao	==	'>='){
					if(!(String(numero).length  >= tamanho)){
						return false;
					}
				}
				else{
					if(!(String(numero).length  == tamanho)){
						return false;
					}
				}
			}
		}
		if(!isNaN(numero) && numero >= 0){
			return true;
		}
		else{
			return false;
		}
		
	}

	/**
	 * Verifica se o ano é um número entre 1900 e 2100.
	 * @return bool
	 * @param {int} ano
	 */
	function validaAno(ano) {
		if(validaNumero(ano, 4)){
			if (ano >= 1900 && ano <= 2100){
				return true;
			}
			else{
				return false;
			}
		}
		else{
			return false;
		}
		
	}
	/**
	 * Verifica se o mes é um número entre 1 e 12
	 * @return bool
	 * @param {int} mes
	 */
	function validaMes(mes) {
		if (validaNumero(mes, 2, '<=')){
			if (mes >= 1 && mes <= 12){
				return true;
			}
			else{
				return false;
			}
		}
		else{
			return false;
		}
		
	}
	/**
	 * Verifica se o dia e um numero entre 1 e 31.
	 * @return bool
	 * @param {int} dia
	 */
	function validaDia(dia) {
		if (validaNumero(dia, 2, '<=')){
			if (dia >=1 && dia <=31){
				return true;
			}
			else{
				return false;
			}
		}
		else{
			return false;
		}
		
	}


	
	/**
	 * Verifica se uma data e valida
	 * @return bool
	 * @param {int} dia
	 * @param {int} mes
	 * @param {int} ano
	 */
	function validaData(dia, mes, ano){
		if (validaAno(ano) && validaMes(mes) && validaDia(dia)){
			if (mes == 2){
				if (ano%100 === 0){
					ano = ano/100;
				}
				if (ano%4 === 0){
					if (dia <= 29){
						return true;
					}
					else{
						return false;
					}
				}
				else{
					if (dia <= 28){
						return true;
					}
					else{
						return false;
					}
				}
				
			}
			else{
				if(mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12 ){
						return true;
				}
				else{
					if (dia <= 30){
						return true;
					}
					else{
						return false;
					}
				}
			}
		}
		else{
			return false;
		}
		
	}
	
	function validaDataString(data) {
		data	=	data.split('-');
		return validaData(parseInt(data[2], 10), parseInt(data[1], 10), parseInt(data[0], 10));
	}
	
	
	/**
     * Verifica se uma determinada string possui SOMENTE valores alfabeticos (de a a z e de A a Z) ou espacos e se seu tamanho e menor ou igual ao limite passado. Se nenhum limite for passado, nao verifica o tamanho da string.
     * @return bool
     * @param {string} string String que sera avaliada.
     * @param {int} limite[optional] Tamanho limite da string.
     */
    function validaAlfabetico(string, limite) {
       if(!limite){
       	limite	=	false;
       }
        /*
         * Expressao regular de valores alfabeticos.
         */
        var listaValores    =    /^[a-zA-ZáàãâéèêíìîóòôõúùûüçÁÀÃÂÉÈÊÍÌÎÓÒÔÕÚÙÛÇ]+[a-zA-Z áàãâéèêíìîóòôõúùûüçÁÀÃÂÉÈÊÍÌÎÓÒÔÕÚÙÛÇ]*$/;
		if (!limite) {
            if (listaValores.test(string)) {
                return    true;
            }
            else {
                return    false;
            }
        }
        else {
            if (string.length <= limite) {
                if (listaValores.test(string)) {
                    return    true;
                }
                else {
                    return    false;
                }
            }
            else {
                return    false;
            }
        }
    }
    
    /**
     * Verifica se uma determinada string possui valores alfanumericos (de a a z e de A a Z e numeros) ou espacos, virgulas, pontos, dois pontos, tracos, parenteses, interrogacoes, exclamacoes ou underscores e se seu tamanho e menor ou igual ao limite passado. Se nenhum limite for passado, nao verifica o tamanho da string.
     * @return bool
     * @param {string} string String que sera avaliada.
     * @param {int} limite[optional] Tamanho limite da string.
     */
    function validaAlfaNumerico(string, limite) {
       
       if (!limite){
       	limite	=	false;
       }
        /*
         * Expressao regular de valores alfa-numericos.
         */
        var listaValores    =    /^[a-zA-Z áàãâéèêíìîóòôõúùûüçÁÀÃÂÉÈÊÍÌÎÓÒÔÕÚÙÛÇ\d\,\.\:\-\(\)\?\!_\/\r\n]+$/;
       
        if (!limite) {
            if (listaValores.test(string)) {
                return    true;
            }
            else {
                return    false;
            }
        }
        else {
            if (string.length <= limite) {
                if (listaValores.test(string)) {
                    return    true;
                }
                else {
                    return    false;
                }
            }
            else {
                return    false;
            }
        }
	}
	
	/**
	 * Verifica se o e-mail é da forma email@email[.com]*
	 * @return bool
	 * @param {string} email
	 */
	function validaEmail(email) {
		var listaValores	=	/^[a-zA-Z1-9_\-\.]{3,}@[a-zA-Z1-9_\-]+(\.[a-zA-Z1-9_\-]+)+$/;
		if (email.length	<=	__TAM_EMAIL_USUARIO__){
			return listaValores.test(email);
		}
		else{
			return false;
		}
		
	}
	
	/**
	 * Verififica se o nome do arquivo da foto e valido e se a extensao dos arquivos de foto e jpg, jpeg, gif, png ou bmp.
	 * @return bool
	 * @param {string} $nomeArquivo
	 */
	function validaFoto(nomeArquivo){
		var listaValores    =    /^[a-zA-ZáàãâéèêíìîóòôõúùûüçÁÀÃÂÉÈÊÍÌÎÓÒÔÕÚÙÛÇ\d\.\-_ :\\]+\.(jpg|jpeg|gif|png|bmp|JPG|JPEG|GIF|PNG|BMP)$/;
		
		if(nomeArquivo.length <= __TAM_URL_FOTO__){
			return listaValores.test(nomeArquivo);
		}
		else{
			return false;
		}
	}
	
	
	/**
	 * Verifica se a Senha não contem nenhum aspas(") ou plique(') e se tem pelo menos 4 caracteres.
	 * @return bool
	 * @param {string} $senha
	 */
	function validaSenha(senha){
		var listaValores	=	/^[^\"']{4,}$/;

		if(senha.length <= __TAM_SENHA_USUARIO__){
			return listaValores.test(senha);
		}
		else{
			return false;
		}
	}
	
	/**
 	* focaProximo
 	* @param {element} elemento
 	* @param {element} proximo 
 	*/
 	function focaProximo(elemento, proximo) {
 		if (elemento.value.length	==	elemento.getAttribute('maxlength')){
 			proximoElemento	=	document.getElementById(proximo);
 			proximoElemento.focus();
 		}
 	}
 	
 	/**
     * Compara duas datas, retorna 1 se a segunda for maior, -1 se for menor e 0 se forem iguais.
     * @return int
     * @param {int} dia1
     * @param {int} mes1
     * @param {int} ano1
     * @param {int} dia2
     * @param {int} mes2
     * @param {int} ano2
     */
    function comparaDatas(dia1, mes1, ano1, dia2, mes2, ano2) {
        if (ano2 > ano1) {
            return 1;
        }
        if (ano2 < ano1) {
            return -1;
        }
        else {
            if (mes2 > mes1) {
                return 1;
            }
            if (mes2 < mes1) {
                return -1;
            }
            else {
                if (dia2 > dia1) {
                    return 1;
                }
                if (dia2 < dia1) {
                    return -1;
                }
                else {
                    return 0;
                }
            }
        }
    }
	
	/**
	 * Compara duas datas no formato String ('AAAA-MM-DD'), retorna 1 se a segunda for maior, -1 se for menor e 0 se forem iguais.
	 * @param {String} data1
	 * @param {String} data2
	 */
	function comparaDatasString(data1, data2){
		data1	=	data1.split('-');
		data2	=	data2.split('-');
		return comparaDatas(parseInt(data1[2], 10), parseInt(data1[1], 10), parseInt(data1[0], 10), parseInt(data2[2], 10), parseInt(data2[1], 10), parseInt(data2[0], 10));
	}
	
	/**
	 * Funcao responsavel por ocultar as mensagens explicativas do sitema.
	 * @param {Object} ajuda
	 */
	function ocultaMensagemExplicativa(ajuda) {
		mensagem	=	document.getElementById('mensagemOculta' + ajuda.id.replace('ajuda', ''));
		mensagem.style.display	=	'none';
	}
	
	/**
	 * Funcao responsavel por exibir as mensagens explicativas do sitema.
	 * @param {Object} ajuda
	 */
	function revelaMensagemExplicativa(ajuda) {
		mensagem	=	document.getElementById('mensagemOculta' + ajuda.id.replace('ajuda', ''));
		mensagem.style.position	=	'absolute';
		mensagem.style.backgroundColor	=	'#FFFFFF';
		mensagem.style.zIndex	=	'2';
		mensagem.style.border	=	'1px solid #000000';
		mensagem.style.display	=	'block';
	}
	
	/**
	 * Funcao responsavel por trocar as mensagens explicativas do sistema por imagens e setar as funcoes de mouse.
	 */
	function escondeMensagensExplicativas() {
		var	listas;
		listas	=	document.getElementsByTagName('ul');
		
		for (var i = 0; i < listas.length; i++) {
			if (listas[i].className == 'listaMensagensExplicativas') {
				var	mensagemOculta	=	listas[i];
				var	elementoPai		=	mensagemOculta.parentNode;
				
				mensagemOculta.id	=	'mensagemOculta' + i;
				
				var	imagemAjuda		=	document.createElement('img');
				imagemAjuda.src		=	__CAMINHO_IMAGENS__ + 'ajuda.png';
				imagemAjuda.id		=	'ajuda' + i;
				imagemAjuda.alt		=	'Dica';
				imagemAjuda.title	=	'Dica de ajuda'
				imagemAjuda.onmouseover = function onmouseover(event){javascript: revelaMensagemExplicativa(this);}
				imagemAjuda.onmouseout	= function onmouseout(event){javascript: ocultaMensagemExplicativa(this);}
				
				elementoPai.removeChild(mensagemOculta);
				elementoPai.appendChild(imagemAjuda);
				elementoPai.appendChild(mensagemOculta);
				ocultaMensagemExplicativa(imagemAjuda);
			}
		}
	}
	
	/**
	 * Funcao responsavel por configurar os inputs de data para darem focus nos inputs seguintes automaticamente em todo o site.
	 */
	function configurarInputsData() {
		var inputs	=	document.getElementsByTagName('input')
		
		for (i in inputs) {
			if (/.*Dia.*/.test(inputs[i].id)) {
				var	input	=	inputs[i];
				
				if (document.getElementById(input.id.replace('Dia', 'Mes')) && document.getElementById(input.id.replace('Dia', 'Ano'))) {
					input.setAttribute('autocomplete', 'off');
					input.onkeyup	=	function onkeyup(event) {javascript: focaProximaData(this);}
				}
			}
			if (/.*Mes.*/.test(inputs[i].id)) {
				var	input	=	inputs[i];
				
				if (document.getElementById(input.id.replace('Mes', 'Dia')) && document.getElementById(input.id.replace('Mes', 'Ano'))) {
					input.setAttribute('autocomplete', 'off');
					input.onkeyup	=	function onkeyup(event) {javascript: focaProximaData(this);}
				}
			}
		}
	}
	
	/**
	 * Funcao responsavel por dar o focus no proximo input de data se o input atual chegar ao seu tamanho maximo.
	 * @param {Object} input
	 */
	function focaProximaData(input) {
		if (input.value.length == 2) {
			if (/.*Dia.*/.test(input.id)) {
				var	proximoInput	=	document.getElementById(input.id.replace('Dia', 'Mes'));
				proximoInput.focus();
			}
			if (/.*Mes.*/.test(input.id)) {
				var	proximoInput	=	document.getElementById(input.id.replace('Mes', 'Ano'));
				proximoInput.focus();
			}
		}
	}
	
	function configurarMensagensSistema() {
		var	divMensagens	=	document.getElementById('divMensagens');
		
		if (divMensagens) {
			var	listaMensagens	=	document.getElementById('listaMensagensSistema');
			
			var divFechar		=	document.createElement('div');
			divFechar.id		=	'divFecharMensagensSistema';
			
			var spanAviso		=	document.createElement('span');
			spanAviso.id		=	'spanAvisoMensagensSistema';
			spanAviso.innerHTML	=	'Atenção!';
			
			var	imagemFechar	=	document.createElement('img');
			imagemFechar.id		=	'imgFecharMensagensSistema';
			imagemFechar.src	=	__CAMINHO_IMAGENS__	+ 'fecharmensagem.png';
			imagemFechar.alt	=	'Fechar Mensagens';
			imagemFechar.title	=	'Fechar mensagens do sistema';
			imagemFechar.onclick	=	function onclick (event) {javascript: fecharMensagensSistema();}
			
			divFechar.appendChild(spanAviso);
			divFechar.appendChild(imagemFechar);
			divMensagens.removeChild(listaMensagens);
			divMensagens.appendChild(divFechar);
			divMensagens.appendChild(listaMensagens);
		}
	}
	
	function fecharMensagensSistema() {
		var	divMensagens	=	document.getElementById('divMensagens');
		var	divTopo			=	document.getElementById('divTopo');
		
		if (divMensagens && divTopo) {
			divTopo.removeChild(divMensagens);
		}
	}

	function executaFuncao(req, funcao, parametro) {
		if (req.readyState == 4) {
			if (typeof(funcao) == 'function') {
				funcao.call(this, parametro, req.responseText);
			}
		}
	}

	function loadXMLDoc(url, funcao, parametro) {
		var req = false;
		// branch for native XMLHttpRequest object
		if(window.XMLHttpRequest && !(window.ActiveXObject)) {
			try {
				req = new XMLHttpRequest();
			} catch(e) {
				req = false;
			}
		// branch for IE/Windows ActiveX version
		} else if(window.ActiveXObject) {
			try {
				req = new ActiveXObject("Msxml2.XMLHTTP");
			} catch(e) {
				try {
					req = new ActiveXObject("Microsoft.XMLHTTP");
				} catch(e) {
					req = false;
				}
			}
		}
		if(req) {
			req.onreadystatechange = function onreadystatechange(){executaFuncao(req, funcao, parametro);}
			req.open("GET", url, true);
			req.send(null);
		}
		else {
			alert("Seu navegador nao suporta AJAX!");
		}
	}
	/**
	 * 
	 * @param {Object} funcao
	 * @param {Object} parametro
	 */
	function pegarHoraServidor(funcao, parametro){
	 	loadXMLDoc(__CAMINHO_INCLUDES__+ 'horaServidor.php', funcao, parametro);
	 }